<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>严格模式的使用</title>
  <!-- 
  在JavaScript中，严格模式（Strict Mode）是一种在更严格的条件下执行代码的方式，它可以帮助开发者捕捉潜在的错误，提高代码的安全性和可维护性。
  一、什么是严格模式
  严格模式是ECMAScript 5引入的一种功能，它通过在代码中启用严格模式来限制某些不安全的操作。启用严格模式后，JavaScript会以更严格的方式解析和执行代码，从而避免一些常见的错误。

  二、如何启用严格模式
  1. 全局启用：
    在JavaScript文件的最顶部添加  `"use strict";` 。
  "use strict";
    // 下面的代码将在严格模式下执行
  2. 函数级启用：
    在函数内部添加  `"use strict";` ，使该函数在严格模式下执行。
    function myFunction() {
        "use strict";
        // 该函数将在严格模式下执行
    }

  三、严格模式的主要特性
  1. 禁用隐式全局变量：
    在严格模式下，如果尝试使用未声明的变量，将会抛出错误。
  "use strict";
    x = 10; // 报错：未声明的变量
  2. 禁止删除变量：
    不能使用  `delete`  删除变量、函数或参数。
  "use strict";
    var x = 10;
    delete x; // 报错：无法删除变量
  3. 禁止重复参数：
    函数参数不能有重复的名称。
  "use strict";
    function myFunction(a, a, b) { // 报错：重复参数
    }
  4. 禁止使用某些保留字：
    在严格模式下，某些保留字（如  `eval`  和  `arguments` ）不能用作变量名。
  "use strict";
    var eval = 10; // 报错：eval是保留字
  5. 更严格的  `this`  绑定：
    在严格模式下，未绑定的  `this`  值为  `undefined` ，而不是全局对象。
  "use strict";
    function myFunction() {
        console.log(this); // 输出：undefined
    }
    myFunction();
  6. 禁止使用  `with`  语句：
    严格模式下禁止使用  `with`  语句，以提高代码的可读性和可维护性。
  "use strict";
    with (Math) { // 报错：禁止使用with语句
        console.log(sqrt(4));
    }

  四、严格模式的优点
  1. 提高安全性：通过禁用一些不安全的特性，减少了潜在的错误和安全隐患。
  2. 捕捉错误：在开发阶段捕捉更多的错误，帮助开发者更早地发现问题。
  3. 优化性能：某些JavaScript引擎在严格模式下能够进行更好的优化，从而提高性能。

  五、总结

  - 严格模式是一种通过  `"use strict";`  语句启用的JavaScript执行模式，可以提高代码的安全性和可维护性。
  - 启用严格模式后，会禁用隐式全局变量、删除变量、重复参数等不安全的特性。
  - 严格模式有助于捕捉潜在错误并提高代码的性能，是现代JavaScript开发中推荐的最佳实践。
   -->
</head>
<body>

  <script>
    // 严格模式
    "use strict";
    // 在严格模式下，未声明的变量会导致错误
    // x = 10; // 报错：未声明的变量

    // 禁止删除变量
    // var x = 10;
    // delete x; // 报错：无法删除变量

    // 禁止重复参数
    // function myFunction(a, a, b) { // 报错：重复参数
    // }

    // 禁止使用某些保留字
    // var eval = 10; // 报错：eval是保留字

    // 更严格的this绑定
    // function myFunction() {
    //     console.log(this); // 输出：undefined
    // }
    // myFunction();

    // 禁止使用with语句
    // with (Math) { // 报错：禁止使用with语句
    //     console.log(sqrt(4));
    // }

    // 给一个函数开启严格模式
    function foo() {
      "use strict"
    }
    
  </script>
  
</body>
</html>